package net.uzen.office.common.interceptor;

import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.uzen.office.common.UzenOfficeConstants;
import net.uzen.office.common.util.SessionUtil;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class SessionInterceptor extends HandlerInterceptorAdapter {

	private final Logger logger = Logger.getLogger(getClass());

	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object obj) throws Exception {
		logger.debug("[!] preHandle >> SessionInterceptor");

		// 세션 정보가 있다면 true 를 리턴하고, 없다면 로그 인 창으로 리디렉션
		if (SessionUtil.isSignedIn(request)) {
			return true;
		} else {
			// 리디렉션 전에 redirectURI 를 parameter 와 함께 돌려줘야 로그인 후 이동할 페이지를 알 수 있음
			// XSS 관련 parameter validation 이 필요
			String returnUrl = StringUtils.isEmpty(request.getRequestURI()) ? null
					: URLEncoder.encode(request.getRequestURI(), request
							.getCharacterEncoding());
			String questionMark = URLEncoder.encode("?", request
					.getCharacterEncoding());
			String returnUrlQueryString = StringUtils.isEmpty(request
					.getQueryString()) ? null : URLEncoder.encode(request
					.getQueryString(), request.getCharacterEncoding());

			logger.debug("[!] returnUrl >> " + StringUtils.isEmpty(returnUrl));
			logger.debug("[!] returnUrlQueryString >> "
					+ StringUtils.isEmpty(returnUrlQueryString));

			StringBuilder redirectUrl = new StringBuilder().append(
					request.getContextPath()).append(
					UzenOfficeConstants.SIGN_IN_PAGE);

			if (StringUtils.isNotEmpty(returnUrl)) {
				redirectUrl = redirectUrl.append(
						UzenOfficeConstants.SIGN_IN_PAGE_RETURN_URL).append(
						returnUrl);
				if (StringUtils.isNotEmpty(returnUrlQueryString)) {
					redirectUrl = redirectUrl.append(questionMark).append(
							returnUrlQueryString);
				}
			}

			logger.debug("[!] redirectUrl >> " + redirectUrl.toString());

			response.sendRedirect(redirectUrl.toString());
			return false;
		}
	}
}
